package com.itheima.web;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.bean.MyPage;
import com.itheima.bean.Setmeal;
import com.itheima.dto.SetmealDto;
import com.itheima.result.R;
import com.itheima.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;
    @GetMapping("/page")
    public R findPage(MyPage page){
        //调用service层的方法执行分页查询的方法
        IPage<SetmealDto> p = setmealService.findPage(page);
        //返回查询成功的IPage对象
        return R.success(p);
    }

    @PostMapping
    //当添加缓存的时候先将缓存中的，缓存数据进行一个清除，在从数据库中获取，；allEntries为true，表示清除所有该类中的缓存数据
    @CacheEvict(value = "cacheSetmeal",allEntries = true)
    public R add(@RequestBody SetmealDto setmealDto){

        //调用service接口的add方法进行添加
        int row = setmealService.add(setmealDto);
        //判断添加返回的影响行数，大于0添加成功，否则添加失败
        if (row>0){
            return R.success("套餐添加成功！");
        }else{
            return R.error("套餐添加失败！");
        }
    }
    //当添加缓存的时候先将缓存中的，缓存数据进行一个清除，在从mysql数据库中获取，存储到缓存中，；allEntries为true，表示清除所有该类中的缓存数据
    @CacheEvict(value = "cacheSetmeal",allEntries = true)
    @DeleteMapping
    public R delete(@RequestParam List<Long> ids){
        //调用Service中的删除方法删除数据库中的数据
        int row = setmealService.delete(ids);
        //判断返回的参数，是否删除成功，返回相应的数据
        if (row>0){
            return R.success("删除成功！");
        }else {
            return R.error("删除失败，可能包含启售套餐");
        }
    }

    @PutMapping
    public R updateSetmeal(@RequestBody SetmealDto setmealDto){
        //调用service进行修改代码
        int row = setmealService.update(setmealDto);
        //根据row变量来判断是否添加成功，返回相应的数据，对象
        if (row > 0){
            return R.success("更新成功！");
        }else {
            return R.error("更新失败！");
        }
    }
    //更新的springCache注解CachePut
    //@CachePut(value = "cacheSetmeal",key ="#ids")
    @PostMapping("/status/{status}")
    public R updateStatus(@PathVariable int status,@RequestParam List<Long> ids){
        //调用service层的方法进行修改状态操作
        int row = setmealService.updateStatus(status, ids);
        //判断是否修改状态是否成功，返回对应的数据对象
        if(row > 0){
            //判断是起售还是停售请求
            if (status == 1) {
                return R.success("启售成功！");
            }else {
                return R.success("停售成功！");
            }
        }else {
            if (status == 1) {
                return R.error("启售失败！");
            }else {
                return R.error("停售失败！");
            }
        }
    }
    //查询的springCache的注解，就是将数据存储到redis里面，如果缓存里面有数据则不用查询MySQL数据库注解返回缓存中的数据
    @Cacheable(value = "setmlealCode",key = "#categoryId + '_' + #status" )
    @GetMapping("list")
    public R list(long categoryId,int status){
        log.debug("我执行了吗------------{}",categoryId);
        //调用service层的方法进行查询套餐分类下的所有套餐
        List<Setmeal> list = setmealService.list(categoryId, status);
        //返回给前端页面查询的套餐对象
        return R.success(list);
    }
}
